﻿using System;
using Microsoft.Office.Interop;

namespace NewFeatureAboutNet4
{
    public class DemoCenter
    {
        #region 1. dynamic demo

        public static void DynamicRun()
        {
            dynamic vint = 10;
            dynamic vdouble = 23.3;
            dynamic vstr = "hello";

            Console.WriteLine("==================  dynamic  ==================");

            Console.WriteLine(vint.GetType());
            Console.WriteLine(vdouble.GetType());
            Console.WriteLine(vstr.GetType());

            // dynamic 不需要进行类型转换，但没有增加或减少危险，当你操作对象时要用到的所有类型检查技巧（例如反射），在动态对象中一样要用到
            object oint = 10;
            //oint = oint + 12.3; compile error
            //oint = (string) oint + "hello";// runtime error
            //Console.WriteLine(oint);

            vint = vint + 10;
            vdouble = vdouble + 10;
            vstr = vstr + 10;

            Console.WriteLine(vint);
            Console.WriteLine(vdouble);
            Console.WriteLine(vstr);

            
        }

        #endregion

        #region 2. 可选（或默认）参数
        /*
         * 可选参数必须放在所有参数的最后。这里就有个问题了，假如我某个方法有两个参数，两个都是可选参数，而我调用的时候只想传入第二个参数，怎么办呢？我们来试试         * 
         * 但很可惜，编译通不过，这个问题，利用下面的 “命名参数” 新特性就可以解决了。 
         */
        //eg:
        // DefaultParam();
        // DefaultParam(3);
        public static void DefaultParam(int i = 10)
        {
            Console.WriteLine("==================  DefaultParam  ==================");
            Console.WriteLine(i);
        }

        #endregion

        #region 3. 命名参数

        //在之前版本的C#中，方法定义的参数顺序必须与方法调用时的参数顺序一致，即方法Method(int i, string s)调用时就必须第一个传入int，第二个传入string，
        //而现在，这个规矩可以被打破了。你可以自己随便什么顺序传入，这也在一定程度上提高了代码的可读性。例子：
        //NamedParam(s:"sa",i:3)
        public static void NamedParam(int i = 10,string s ="www")
        {
            Console.WriteLine("==================  DefaultParam  ==================");
            Console.WriteLine(i);
        }

        #endregion

        #region 4. 提高COM的互操作性

        //基于以上三点新特性，COM的互操作性也被提高了。以后不用再写如下丑陋的代码：
        public static void ComInterop()
        {
            var excelApp = new Microsoft.Office.Interop.Excel.Application();
            excelApp.Range["A1", "B4"].AutoFormat(Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatTable3,
                Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing);
        }

        //现在只需这么写就搞定了：
        public static void ComInterop2()
        {
            var excelApp = new Microsoft.Office.Interop.Excel.Application();
            excelApp.Range["A1", "B3"].AutoFormat(Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic2);
        }

        #endregion
    }
}
